//! 系统 BSP 定义
//!
//! 由板级bsp信息导出, 是系统运行的配置信息

use core::fmt;

pub use bsp_define::*;
use bsp_define::{
    clocksource::{SetNextEventFuc, SetStateStopedFuc},
    irqchip::{IrqType, IrqchipIrqState, Result},
    memrange::MemDefine,
    smp::{Cpumask, SmpDefine},
};

unsafe extern "Rust" {
    /// 系统启动早期调用, 不能使用串口内存分配等功能
    pub fn __early_init();
    /// 系统启动后期调用, 可以使用内核大部分功能, 需要在这里完成APP加载
    pub fn __late_init();
    /// 系统从核启动调用
    pub fn __secondary_init();

    /// 多核信息定义
    pub fn __smp_define() -> &'static SmpDefine;
    /// 内存域信息定义
    pub fn __mems_define() -> &'static MemDefine;

    /// 控制台初始化
    pub fn __console_init();
    /// 控制台输出
    pub fn __console_output(args: fmt::Arguments<'_>);

    /// 中断控制器名字
    pub fn __irqchip_name() -> &'static str;
    /// 中断控制器支持的最大中断数量
    pub fn __irqchip_irqs_max() -> usize;
    /// 中断控制器应答中断
    pub fn __irqchip_irq_ack(hwirq: u32);
    /// 中断控制器结束中断
    pub fn __irqchip_irq_eoi(hwirq: u32);
    /// 中断控制器禁用一个中断
    pub fn __irqchip_irq_disable(hwirq: u32);
    /// 中断控制器激活一个中断
    pub fn __irqchip_irq_enable(hwirq: u32);
    /// 中断控制器设置中断亲和性
    pub fn __irqchip_irq_set_affinity(hwirq: u32, cpumask: Cpumask) -> Result<()>;
    /// 中断控制器设置中断类型
    pub fn __irqchip_irq_set_type(hwirq: u32, irq_type: IrqType) -> Result<()>;
    /// 中断控制器获取控制器状态
    pub fn __irqchip_irq_get_irqchip_state(hwirq: u32, which: IrqchipIrqState) -> Result<bool>;
    /// 中断控制器设置控制器状态
    pub fn __irqchip_irq_set_irqchip_state(
        hwirq: u32,
        which: IrqchipIrqState,
        state: bool,
    ) -> Result<()>;
    /// 中断控制器向一个处理器发送 ipi 中断
    pub fn __irqchip_ipi_send_single(hwirq: u32, cpu: usize);
    /// 中断控制器向一组处理器发送 ipi 中断
    pub fn __irqchip_ipi_send_mask(hwirq: u32, cpumask: &Cpumask);
    /// 中断控制器硬中断处理函数入口
    pub fn __irqchip_irq_handler();
    /// 中断控制器初始化
    pub fn __irqchip_irq_init();
    /// 中断控制器处理器接口初始化
    pub fn __irqchip_irq_init_cpu();

    /// 时钟系统初始化
    pub fn __clock_init();
    /// 时钟系统初始化处理器
    pub fn __clock_init_cpu();
    /// 获取设置下一个时钟事件回调
    pub fn __clock_get_set_next_event() -> SetNextEventFuc;
    /// 获取停止当前时钟事件回调
    pub fn __clock_get_set_state_stoped() -> SetStateStopedFuc;
    /// 时钟事件源频率
    pub fn __clock_rate() -> usize;
    /// 时钟事件源最小tick
    pub fn __clock_min_delta() -> u64;
    /// 时钟事件源最大tick
    pub fn __clock_max_delta() -> u64;

    /// 系统心跳周期
    pub fn __system_tick() -> usize;
}
